#include"SeqList.h"

void SLInit(SL* psl){
    psl->array_=NULL;
    psl->length_=psl->capacity_=0;
}
void SLDestroy(SL* psl){
    free(psl->array_);
    psl->array_=NULL;
    psl->length_=psl->capacity_=0;
}
void SLPrint(SL*psl){
    for(int i=0;i<psl->length_;i++){
        printf("%d ",psl->array_[i]);
    }
    printf("\n");
}
void Reserve(SL*psl){
    if(psl->capacity_==psl->length_){
        int newcapacity=psl->capacity_==0?4:psl->capacity_*2;
        SLDataType*tmp=(SLDataType*)realloc(psl->array_,sizeof(SLDataType)*newcapacity);
        if(tmp==NULL){
            perror("realloc fail");
        }
        psl->array_=tmp;
        psl->capacity_=newcapacity;
        
    }
}
void SLPushBack(SL*psl,SLDataType val){
    // if(psl->length_ == psl->capacity_){
    //     Reserve(psl);
    // }
    // psl->array_[psl->length_] = val;
    // psl->length_++;
    SLInsert(psl,psl->length_+1,val);

}
void SLPushFront(SL*psl,SLDataType val){
    // if(psl->length_==psl->capacity_){
    //     Reserve(psl);
    // }
    // size_t tmp = psl->length_;
    // while(tmp > 0){
    //     psl->array_[tmp]=psl->array_[tmp-1];
    //     tmp--;
    // }
    // psl->array_[0]=val;
    // psl->length_++;
    SLInsert(psl,1,val);
}
void SLPopBack(SL*psl){
    // if(psl->length_==0)return;
    // psl->length_--;
    SLDataType val;
    SLErase(psl,psl->length_,&val);
}
void SLPopFront(SL*psl){
    // if(psl->length_==0)return;
    // size_t tmp=1;
    // while(tmp<=psl->length_-1){
    //     psl->array_[tmp-1]=psl->array_[tmp];
    //     tmp++;
    // }
    // psl->length_--;
    SLDataType val;
    SLErase(psl,1,&val);

}
//按数组下标插入
// void SLInsert(SL*psl,size_t pos,SLDataType val){
//     if(pos > psl->length_|| pos < 0)return;
//      if(psl->length_==psl->capacity_){
//         Reserve(psl);
//     }
//     size_t tmp=psl->length_;
//     while(tmp>pos){
//         psl->array_[tmp]=psl->array_[tmp-1];
//         tmp--;
//     }
//     psl->array_[pos]=val;
//     psl->length_++;
// }

//按位序插入(第几个位置)
void SLInsert(SL*psl,int pos,SLDataType val){
     if(psl->length_==psl->capacity_){
        Reserve(psl);
    }
    size_t tmp=psl->length_;
    while(tmp>pos-1){
        psl->array_[tmp]=psl->array_[tmp-1];
        tmp--;
    }
    psl->array_[pos-1]=val;
    psl->length_++;
}

//按照数组下标删除
// void SLErase(SL*psl,size_t pos){
//     if(psl->length_==0)return;
//     size_t tmp=pos;
//     while(tmp<psl->length_){
//         psl->array_[tmp]=psl->array_[tmp+1];
//         tmp++;
//     }
//     psl->length_--;
// }

//按照位序删除
void SLErase(SL*psl,int pos,SLDataType* val){
    if(psl->length_==0)return;
    int tmp=pos;
    while(tmp <= psl->length_){
        psl->array_[tmp-1]=psl->array_[tmp];
        tmp++;
    }
    *val=psl->array_[pos-1];
    psl->length_--;
}

SLDataType SLFind(SL*psl,size_t pos){
    if(pos>=psl->length_)return 0;
    return psl->array_[pos];
}
SLDataType GetElem(SL*psl,int pos){
    if(pos<1||pos>psl->length_)return -1;
    return psl->array_[pos-1];

}
int LocateElem(SL*psl,SLDataType val){
    for(int i=0;i<psl->length_;i++){
        if(psl->array_[i]==val){
            return i+1;
        }
    }
    return 0;
}
